/*
 * @Date: 2024-02-23 17:40:51
 * @LastEditTime: 2024-05-10 17:38:42
 * @Description:
 */
import {isArray, isObject} from '../common.js'

/**
 * 从会话存储中获取指定键的值，并尝试将其从字符串解析为JavaScript对象。
 *
 * @param {string} key 会话存储中要获取的键名。
 * @returns {*} 返回解析后的值，如果解析失败则返回原始字符串值。
 */
export const getSessionStorage = (key) => {
  const val = window.sessionStorage.getItem(key);
  
  try {
    return parseJSON(val); // 封装JSON解析逻辑到独立的函数中以提高代码模块化和可读性
  } catch (e) {
    // 在捕获异常时提供更多上下文信息给调用者
    console.error(`Error parsing JSON for key "${key}": ${e.message}`);
    return val;
  }
};

/**
 * 解析JSON字符串为JavaScript对象。
 *
 * @param {string} jsonString 待解析的JSON字符串。
 * @returns {*} 返回解析后的JavaScript对象。
 * @throws {Error} 如果输入值为null或非字符串，或者JSON解析失败，则抛出错误。
 */
export const parseJSON = (jsonString) => {
  // 增加对 null 的显式检查，以及更细致的错误处理
  if (jsonString === null) {
    throw new Error('Expected a non-null value for JSON parsing');
  }
  if (typeof jsonString !== 'string') {
    throw new TypeError('Expected a string for JSON parsing');
  }
  
  try {
    return JSON.parse(jsonString);
  } catch (e) {
    throw new Error(`Failed to parse JSON: ${e.message}`);
  }
}

/**
 * 将值设置到会话存储中，如果值为数组或对象，则先将其转换为JSON字符串。
 *
 * @param {string} key 会话存储中的键名。
 * @param {*} value 要存储的值，如果为数组或对象，将被转换为JSON字符串。
 */
export const setSessionStorage = (key, value) => {
  let newValue = value
  if (isArray(value) || isObject(value)) {
    newValue = JSON.stringify(newValue)
  }
  window.sessionStorage.setItem(key, newValue);
};

/**
 * 从会话存储中移除指定键的值。
 *
 * @param {string} key 会话存储中要移除的键名。
 */
export const removeSessionStorage = (key) => {
  window.sessionStorage.removeItem(key);
};

/**
 * 清除会话存储中的所有值。
 */
export const clearSessionStorage = () => {
  window.sessionStorage.clear();
};


/**
 * 获取本地存储
 * @param key
 * @returns {*|string}
 */
export const getLocalStorage = (key) => {
  const val = window.localStorage.getItem(key);
  try {
    return parseJSON(val); // 封装JSON解析逻辑到独立的函数中以提高代码模块化和可读性
  } catch (e) {
    // 在捕获异常时提供更多上下文信息给调用者
    console.error(`Error parsing JSON for key "${key}": ${e.message}`);
    return val;
  }
}
/**
 * 设置本地存储
 * @param key
 * @param value
 */
export const setLocalStorage = (key, value) => {
  let newValue = value
  if (isArray(value) || isObject(value)) {
    newValue = JSON.stringify(newValue)
  }
  window.localStorage.setItem(key, newValue);
}

/**
 * 从本地存储中移除指定键的值
 * @param key
 */
export const removeLocalStorage = (key) => {
  window.localStorage.removeItem(key);
}

/**
 * 清除本地存储中的所有值。
 */
export const clearLocalStorage = () => {
  window.localStorage.clear();
}
